from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation

from users.models import User


class Tag(models.Model):

    """ Тег для метки какого то материала """

    title = models.CharField(max_length=250)
    description = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created']

    def __str__(self):
        return self.title


class Content(models.Model):

    """ Контент, который может быть добавлен пользователем (картинки, видео и т.д.) """

    tags = models.ManyToManyField(Tag, related_name='%(class)s_related', blank=True)
    created = models.DateTimeField(auto_now_add=True, verbose_name='Создано')
    updated = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
    title = models.CharField(max_length=250, unique=True)
    description = models.TextField(blank=True)
    slug = models.SlugField(verbose_name='URL')

    class Meta:
        abstract = True
        ordering = ['-created']
        verbose_name = 'Содержимое'
        verbose_name_plural = 'Содержимое'

    def __str__(self):
        return self.title


class Video(Content):

    """ Видео пользователя """

    url = models.URLField(verbose_name='Видео')

    class Meta:
        verbose_name = 'Видео'
        verbose_name_plural = 'Видео'


class Image(Content):

    """ Изображение пользователя """

    photo = models.ImageField(upload_to="%Y/%m/%d/")

    class Meta:
        verbose_name = 'Изображение'
        verbose_name_plural = 'Изображения'


class Article(Content):

    """ Какие-то статьи написанные пользователем """

    class Meta:
        verbose_name = 'Статья'
        verbose_name_plural = 'Статьи'


class Additionaly(models.Model):

    """ Дополнительная информация о содержимом """

    note = models.TextField(verbose_name='Заметка')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    photo = models.ImageField(upload_to="%Y/%m/%d/")
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        ordering = ['-updated', '-created']
        verbose_name = 'Дополнение к переводу'
        verbose_name_plural = 'Дополнения к переводу'


class Phrase(Content):

    """ Какие-то фразы добавленные пользователем """

    title = None
    description = None
    content_original = models.CharField(max_length=300, unique=True, verbose_name='Фраза')
    content_translation = models.CharField(max_length=300, unique=True, verbose_name='Перевод')
    additionally = GenericRelation(Additionaly)

    class Meta:
        verbose_name = 'Фраза'
        verbose_name_plural = 'Фразы'


class PartOfSpeech(models.Model):

    """ Часть речи """

    name = models.CharField(max_length=50, unique=True, verbose_name='Часть речи')

    class Meta:
        verbose_name = 'Часть речи'
        verbose_name_plural = 'Части речи'


    def get_related_words(self):

        """ Получаем связанные слова """

        pass

    def __str__(self):
        return self.name


class Word(Content):

    """ Какие-то слова добавленные пользователем """

    title = None
    description = None
    word = models.CharField(max_length=100, unique=True, verbose_name='Слово')
    translate = models.CharField(max_length=100, verbose_name='Перевод')
    part_of_speech = models.ForeignKey(PartOfSpeech, on_delete=models.CASCADE,
                                       related_name='words', verbose_name='Часть речи')

    class Meta:
        verbose_name = 'Слово'
        verbose_name_plural = 'Слова'

    def __str__(self):
        return self.word


class Verb(Word):

    """ Часть речи - глагол """

    simple_past = models.CharField(max_length=100)
    past_participle = models.CharField(max_length=100)

    class Meta:
        verbose_name = 'Глагол'
        verbose_name_plural = 'Глаголы'
